//接口 用于键值对、JSON数据的自定义约束
//命名使用大驼峰
interface UserType{
	readonly name:string, //只读字段
	age:number,
	skills?:string[] //可选参数
	update?:()=>void //函数类型
}

let user:UserType = {
	name:'问剑白玉京',
	age:100,
	update:()=>{
		console.log('调用update');
	}
}
// user.score = 100 //警告
user.skills = ['剑来','万剑归宗','天下无敌','天上来敌']
// user.name = '杨敏'//尝试修改只读字段警告

if(user.update){
	user.update()
}

//动态可索引(鸿蒙中使用需要注意)
interface DynamicType{
	[key:string]:string
}
let d:DynamicType = {
	'123':'123',
	'a':'true',
	'b':'666'
}
console.log(d['123'],d.a);

// 接口预定函数(较少使用)
interface Sum {
	(a:number,b:number):number
}

let func:Sum = (m,n)=>{
	return n + m
}

// 接口继承
// 好处可以解决接口之间的字段复用
// 弊端会让代码耦合度变高，代码拆分及复用等会收到影响
// 代码建议，低耦合，高内聚 （组件封装的开放封闭原则）
// 生命体--动物--人
interface LiveType {
	move:boolean,
	breath:()=>void
}

interface Animal extends LiveType{
	name:string,
	age:number
}
let cat:Animal = {
	name:'猫',
	age:100,
	move:true,
	breath(){
		console.log(this.name+'在呼吸');
	}
}
interface Person extends Animal {
	coding:()=>void
}
let p:Person = {
	name:'程序猿',
	age:21,
	move:true,
	breath(){
		console.log(this.name+'在呼吸');
	},
	coding:()=>{
		console.log('在写代码');
	}
}
p.breath()
